home *** CD-ROM | disk | FTP | other *** search
/ Introduction to 3D Game …ogramming with DirectX 12 / Introduction-to-3D-Game-Programming-with-DirectX-12.ISO / Code.Textures / Chapter 23 Character Animation / SkinnedMesh / Shaders / Shadows.hlsl < prev    next >
Text File  |  2016-03-02  |  3KB  |  84 lines

  1. //***************************************************************************************
  2. // Shadows.hlsl by Frank Luna (C) 2015 All Rights Reserved.
  3. //***************************************************************************************
  4.  
  5. // Include common HLSL code.
  6. #include "Common.hlsl"
  7.  
  8. struct VertexIn
  9. {
  10.     float3 PosL    : POSITION;
  11.     float2 TexC    : TEXCOORD;
  12. #ifdef SKINNED
  13.     float3 BoneWeights : WEIGHTS;
  14.     uint4 BoneIndices  : BONEINDICES;
  15. #endif
  16. };
  17.  
  18. struct VertexOut
  19. {
  20.     float4 PosH    : SV_POSITION;
  21.     float2 TexC    : TEXCOORD;
  22. };
  23.  
  24. VertexOut VS(VertexIn vin)
  25. {
  26.     VertexOut vout = (VertexOut)0.0f;
  27.  
  28.     MaterialData matData = gMaterialData[gMaterialIndex];
  29.     
  30. #ifdef SKINNED
  31.     float weights[4] = { 0.0f, 0.0f, 0.0f, 0.0f };
  32.     weights[0] = vin.BoneWeights.x;
  33.     weights[1] = vin.BoneWeights.y;
  34.     weights[2] = vin.BoneWeights.z;
  35.     weights[3] = 1.0f - weights[0] - weights[1] - weights[2];
  36.  
  37.     float3 posL = float3(0.0f, 0.0f, 0.0f);
  38.     for(int i = 0; i < 4; ++i)
  39.     {
  40.         // Assume no nonuniform scaling when transforming normals, so 
  41.         // that we do not have to use the inverse-transpose.
  42.  
  43.         posL += weights[i] * mul(float4(vin.PosL, 1.0f), gBoneTransforms[vin.BoneIndices[i]]).xyz;
  44.     }
  45.  
  46.     vin.PosL = posL;
  47. #endif
  48.  
  49.     // Transform to world space.
  50.     float4 posW = mul(float4(vin.PosL, 1.0f), gWorld);
  51.  
  52.     // Transform to homogeneous clip space.
  53.     vout.PosH = mul(posW, gViewProj);
  54.     
  55.     // Output vertex attributes for interpolation across triangle.
  56.     float4 texC = mul(float4(vin.TexC, 0.0f, 1.0f), gTexTransform);
  57.     vout.TexC = mul(texC, matData.MatTransform).xy;
  58.     
  59.     return vout;
  60. }
  61.  
  62. // This is only used for alpha cut out geometry, so that shadows 
  63. // show up correctly.  Geometry that does not need to sample a
  64. // texture can use a NULL pixel shader for depth pass.
  65. void PS(VertexOut pin) 
  66. {
  67.     // Fetch the material data.
  68.     MaterialData matData = gMaterialData[gMaterialIndex];
  69.     float4 diffuseAlbedo = matData.DiffuseAlbedo;
  70.     uint diffuseMapIndex = matData.DiffuseMapIndex;
  71.     
  72.     // Dynamically look up the texture in the array.
  73.     diffuseAlbedo *= gTextureMaps[diffuseMapIndex].Sample(gsamAnisotropicWrap, pin.TexC);
  74.  
  75. #ifdef ALPHA_TEST
  76.     // Discard pixel if texture alpha < 0.1.  We do this test as soon 
  77.     // as possible in the shader so that we can potentially exit the
  78.     // shader early, thereby skipping the rest of the shader code.
  79.     clip(diffuseAlbedo.a - 0.1f);
  80. #endif
  81. }
  82.  
  83.  
  84.